package com.example.springboot.auth.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.example.springboot.auth.service.IAuthService;
import com.example.springboot.common.dto.LoginDTO;
import com.example.springboot.common.entity.CommonUser;
import com.example.springboot.common.exception.ServiceException;
import com.example.springboot.common.request.LoginRequest;
import com.example.springboot.common.request.RegisterRequest;
import com.example.springboot.common.result.Result;
import com.example.springboot.common.service.IUserService;
import com.example.springboot.utils.TokenUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class AuthServiceImpl implements IAuthService {

    @Autowired
    private IUserService userService;
    
    @Override
    public LoginDTO login(LoginRequest loginRequest) {
        loginRequest.setPassword(securePass(loginRequest.getPassword())); //设置md5加密
        // 从统一用户表查询用户
        CommonUser user = userService.getByUsernameAndPassword(loginRequest);
        if (user == null) {
            throw new ServiceException("用户名或密码错误");
        }
        
        // 检查用户登录状态
        if (user.getIsLogin() != null && user.getIsLogin() == 1) {
            throw new ServiceException("该账号已被禁用");
        }
        
        LoginDTO loginDTO = new LoginDTO();
        // 复制用户信息到登录DTO
        BeanUtils.copyProperties(user, loginDTO);

        // 生成token
        String token = TokenUtils.genToken(String.valueOf(user.getId()), user.getPassword());
        loginDTO.setToken(token);
        return loginDTO;
    }

    @Override
    public Result register(RegisterRequest registerRequest) {
        // 验证密码一致性
        if (!registerRequest.getPassword().equals(registerRequest.getConfirmPassword())) {
            throw new ServiceException("两次输入的密码不一致");
        }
        
        // 检查用户名唯一性
        CommonUser dbUser = userService.getByUsername(registerRequest.getUsername());
        if (dbUser != null) {
            throw new ServiceException("用户名已存在");
        }
        
        // 所有注册用户默认分配user角色，admin角色只能通过数据库脚本创建
        CommonUser user = new CommonUser();
        BeanUtils.copyProperties(registerRequest, user);

        user.setPassword(securePass(user.getPassword())); //设置md5加密
        // 设置默认值
        user.setRole("user"); // 强制设置为user角色
        user.setIsLogin(0); // 默认允许登录
        user.setIsWord(0); // 默认不禁言
        user.setAvatar("https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"); // 设置默认头像
        user.setEmail(user.getUsername() + "@" + "qq.com"); // 设置默认邮箱
        Date now = new Date();
        user.setCreatetime(now);
        // 保存用户
        userService.save(user);
        
        // 返回注册成功消息
        return Result.success("注册成功");
    }

    @Override
    public Result logout() {
        // 在当前简单实现中，主要依赖前端清除本地存储的用户信息
        // 这里提供统一的API接口，以便后续系统扩展（如添加token失效逻辑等）
        return Result.success("退出登录成功");
    }

    // 封装加密方法
    private String securePass(String password){
        return SecureUtil.md5(password);

    }
}